Skip to content

Кадрирование шапки и логотипа с отдельной мобильной обложкой - #434

Merged
TThanos3000 merged 1 commit into
devfrom
feat/dev-program-image-framing
Oct 17, 2026
Merged

TThanos3000 merged 1 commit into
devfrom
feat/dev-program-image-framing

Conversation

@TThanos3000

@TThanos3000 TThanos3000 commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Что изменено

В предпросмотре организатор двигает изображение внутри шапки/логотипа мышью, пальцем или стрелками и выбирает масштаб100–300%. Для телефона добавлен отдельный необязательный cover upload и независимый кадр. Исходные файлы сохраняются; выбранный кадр сохраняется обычной кнопкой формы и восстанавливается после reload.

Зачем

Широкая шапка обрезает надписи на телефоне; организатору нужно самому выбрать кадр доSave. Spec, AC, review и screenshots.

Реализация

Shared ImageFramingDirective задаёт одинаковые object-position/transform-origin/scale. Avatar поддерживает framing только по opt-in: progress/online остаются вне crop. Program detail, cards иsidebar используют сохранённый logo; cover использует mobile source при ширине<1000. Форма хранит полный draft document, reset/replace/remove учитывают mobile fallback. Pointer capture, native range, keyboard и busy/error guards сохраняют существующий flow.

API

Depends on API#782: mobile_cover_image_address иimage_framing в существующих management endpoints. Additive контракт, deep camel/snake conversion остаётся прежней; frontend tolerates missing fields. Backend/migration0020 необходимо выкатить раньше frontend.

UI

Существующие preview, Mont, DS button directive/foundation и tokens; добавлены target selection, range, точный сдвиг иreset. Локальная итерация по прямому запросу пользователя, без нового экрана. Desktop, mobile.

Permissions

Не менялись: существующие organizer route иserver-side object permissions. Новый child output меняет только draft; autosave нет.

Проверки

  • 47 targeted Vitest /8 files: management save/409/upload/reset, preview drag/keyboard/zoom, shared directive, canonical/legacy Avatar, program card, management HTTP adapter.
  • Development build, scoped ESLint/Stylelint/Prettier, git diff --check.
  • 7 Chrome scenarios с реальными local Django/PostgreSQL: mouse/native touch, slider/keyboard, independent desktop/mobile, real upload, save/reload/cancel/failed upload/concurrent409/remove.
  • Actual header vs preview: точное совпадение framing, dimensions иsources; sidebar logo учитывает crop. Оба режима при viewport360/390 без overflow; page errors0.
  • Review: source/contract/AC audit, opt-in Avatar regression, original assets preserved; blocking findings отсутствуют.

Acceptance criteria

  • F1 — drag/keyboard/buttons/zoom/reset, fixed bounded crop.
  • F2 — independent optional mobile image, main fallback.
  • F3 — draft before Save, persisted real page after Save/reload.
  • F4 — replace/remove/cancel/error/409 preserve correct frames; toggles pristine.
  • F5 — supported by API#782 tests and real localAPI integration.
  • F6 — legacy avatars preserved, narrow/touch/keyboard/busy/error checks.

Не проверено

Физический телефон и OS screen reader. В localQA заменён только внешний storage adapter; multipart/auth/UserFile/program settings настоящие. Live organizer session отсутствует. После deployment выполнены16 anonymous release checks; organizer interaction проверено в7 local Chrome scenarios с настоящими Django/PostgreSQL.

Риски / migration

Frontend migration не нужна. Обязателен backend-first rollout API#782/migration0020. Только dev; production не запрошен.

Dev release

  • API#782 deployed successfully in attempt2. Migration0020 applied; no pending migrations; exact image web/celery, admin smoke and Celery ping PASS.
  • Frontend deploy39050322402 SUCCESS: 2163 tests /421 files, format, lint, build and publication PASS. Merge43855be18baac925fad765c4e635d95a6b8b33bc.
  • 16 anonymous live release checks PASS: expected main-JRADTMZ4.js and management chunk-T2FIQMRA.js contain new framing/mobile UI; login, mobile layout/deep links, private401 and public API framing contracts verified. No page/static errors.
  • Local API/PostgreSQL stopped; temporary JWT fixture removed. Owner password was entered only by user in SSH; production credentials were not reused.

Available on dev. Organizer mouse/touch/save/cancel/409 scenarios passed against isolated real local Django/PostgreSQL; anonymous live checks do not claim authenticated organizer testing. Production untouched.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants